
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Serilog;
using System.Reflection;
using System.Text;
using System.Text.Json.Serialization;
using 日志的使用.自定义的内容;
namespace 日志的使用
{
    public class Program1
    {
        public static void Main1(string[] args)
        {
            //一，构造了一个Web的Builder -建造者模式
            WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
            //二、 构造一个Web应用程序
            WebApplication app = builder.Build();

            #region 管道内部使用说明
            //1. 管道： 对于客户端发起Http请求来到服务器以后，服务器中经过每个环节的处理，把处理的结果写入到Response中，最后响应给客户端。 多个处理的环节连接一起就好似一根管子一样。
            //2. 如果 WebApplication app = builder.Build();后不进行配置，则响应404（没有资源）。
            //3. 如果配置： 是基于 IApplicationBuilder 配置的 WebApplication 
            //4. 创建new() IApplicationBuilder, 再通过 builder.Add....  添加相应的配置信息，然后使用 Build() 构建出Application
            //5. 查看源码： WebApplication 中的 Use() > IApplicationBuilder的 Use()，而在ApplicationBuilder 定义一个 List, 调用Use(中间件)底层就是 list.Add(中间件); 
            //6. 在执行app.Run()， WebApplication内部定义一个响应404的委托，然后循环list,从后向前取，执行委托，把定义好的响应404委托传入进来 
            #endregion

            //context.Response.ContentType = "text/html;charset=utf-8";
            Func<RequestDelegate, RequestDelegate> middleware00 = new Func<RequestDelegate, RequestDelegate>((requestDelegate) =>
            {
                return new RequestDelegate(async context =>
                {
                    context.Response.ContentType = "text/html;charset=utf-8";
                    await context.Response.WriteAsync("<h1>00中间件输出Begin</h1>");
                    await requestDelegate.Invoke(context);
                    await context.Response.WriteAsync("<h1>00中间件输出End</h1>");
                });
            });

            Func<RequestDelegate, RequestDelegate> middleware01 = (requestDelegate => async context =>
            {
                await context.Response.WriteAsync("<h1>01中间件输出Begin</h1>");
                await requestDelegate.Invoke(context);
                await context.Response.WriteAsync("<h1>01中间件输出End</h1>");

            });

            Func<HttpContext, RequestDelegate, Task> middleware02 = new Func<HttpContext, RequestDelegate, Task>(async (context, request) =>
            {
                await context.Response.WriteAsync("<h1>02中间件输出Begin</h1>");
                await request(context);
                await context.Response.WriteAsync("<h1>02中间件输出End</h1>");
            });

            Func<HttpContext, RequestDelegate, Task> middleware03 = (async (context, request) =>
            {
                await context.Response.WriteAsync("<h1>03中间件输出Begin</h1>");
                // await request(context);  //这是最后的一个中间件，因此不要去调用 request.
                await context.Response.WriteAsync("<h1>03中间件输出End</h1>");
            });


            ((IApplicationBuilder)app).Use(middleware00).Use(middleware01)
                .Use(next=> async context => {
                await context.Response.WriteAsync("<h1>02-01中间件输出Begin</h1>");
                await next(context);
                await context.Response.WriteAsync("<h1>02-01中间件输出End</h1>");
            });
            app.Use(middleware02);
            app.Use(middleware03);

            //三、运行web应用程序
            app.Run();
        }
    }
}